package packGestionAgendas;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.Vector;

public class PanelOcupacion {
	private static PanelOcupacion mPanelOcupacion = new PanelOcupacion();
	private Vector listaIntervalos;
	
	private PanelOcupacion()
	{
		inicializar();
	}
	
	public static  PanelOcupacion obtPanelOcupacion() {
		return mPanelOcupacion;		
	}
	
	public void construirPanelOcupacion(ListaEmpleados pListaEmpleados, Date pFechaInicio, Date pFechaFinal) {
		inicializar();
		
		Date fechaAux = pFechaInicio;
		Calendar cauxInicio = new GregorianCalendar();
		cauxInicio.setTime(fechaAux);
		
		Calendar cauxFinal = new GregorianCalendar();
		cauxFinal.setTime(pFechaFinal);
		
		while (cauxInicio.before(cauxFinal)) {
			generarIntervalos(cauxInicio.getTime(),pListaEmpleados);
			cauxInicio.add(Calendar.HOUR, 24);
		}
	}

	
	public void mostrarPanelOcupacion(Date pFechaInicio, Date pFechaFinal) {

		Date fechaAux = pFechaInicio;
		Intervalo interv;

		Calendar cauxInicio = new GregorianCalendar();
		cauxInicio.setTime(fechaAux);
		
		Calendar cauxFinal = new GregorianCalendar();
		cauxFinal.setTime(pFechaFinal);
		
		while (cauxInicio.before(cauxFinal)) {
			if ( (cauxInicio.get(Calendar.HOUR_OF_DAY) >= 8) && (cauxInicio.get(Calendar.HOUR_OF_DAY) <= 16) ){
				interv = obtIntervalo(cauxInicio.getTime());  // ojo, fecha exacta? (hora incluída?)
				interv.mostrar();
			}
			cauxInicio.add(Calendar.HOUR, 1);
		}
		
	}
	

	/*
	 * Construye la lista de intervalos (busca si cada empleado de la lista tiene libre todas las horas de ese día)
	 * En caso negativo (algún empleado de la lista tiene alguna hora de ese día ocupada, se marca ese 
	 * intervalo horario (una hora) como ocupado
	 */
	private void generarIntervalos(Date pFechaAux, ListaEmpleados pListaEmpleados) {
		
		// Deprecated:
		// Date unaHora = new Date(pFechaAux.getYear(), pFechaAux.getMonth(),pFechaAux.getDay(),8,0);
		
		// Intervalos van de 8:00 a 16:00 
		Calendar diaHoraInicial = new GregorianCalendar();
		diaHoraInicial.setTime(pFechaAux);
		diaHoraInicial.set(Calendar.HOUR_OF_DAY,8);
		
		Calendar diaHoraFinal = new GregorianCalendar();
		diaHoraFinal.setTime(pFechaAux);
		diaHoraFinal.set(Calendar.HOUR_OF_DAY,16);
		
		
		Intervalo unIntervalo;
		while (diaHoraInicial.before(diaHoraFinal )) {
			unIntervalo = new Intervalo(diaHoraInicial.getTime());
			if (!pListaEmpleados.estaLibre(pFechaAux))
				unIntervalo.ocupar(true);
			else 
				unIntervalo.ocupar(false);
			listaIntervalos.add(unIntervalo);
			diaHoraInicial.add(Calendar.HOUR, 1);
		}
	}

	private Intervalo obtIntervalo(Date pFechaAux) {
		Intervalo intervalo = null;
		Iterator iter = obtIterador();
		boolean encontrado = false;
		Calendar c = new GregorianCalendar();
		Calendar aux = new GregorianCalendar();
		aux.setTime(pFechaAux);
		
		while (iter.hasNext() && !encontrado) {
			intervalo = (Intervalo) iter.next();
			c.setTime(intervalo.obtFecha());
			if (   c.get(Calendar.DAY_OF_YEAR) == aux.get(Calendar.DAY_OF_YEAR)  
					&& c.get(Calendar.YEAR) == aux.get(Calendar.YEAR) 
					&& c.get(Calendar.HOUR_OF_DAY) == aux.get(Calendar.HOUR_OF_DAY)		
			) 
			{
				encontrado = true;
			}
			
		}
		return intervalo;
	}

	private Iterator obtIterador() {
		return listaIntervalos.iterator();
	}

	private void inicializar() {
		listaIntervalos = new Vector();
	}
}
